package com.order.service.lmpl;

import com.order.mapper.TravelRequestMapper;
import com.order.service.TravelRequestService;
import com.usian.order.Order;
import com.usian.order.Order_Take;
import com.usian.order.TravelRequest;
import com.usian.travelSchedule.TravelSchedule;
import com.usian.vo.Result;
import com.usian.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@Transactional
public class TravelRequestServicelmpl implements TravelRequestService {
    @Autowired
    private TravelRequestMapper travelRequestMapper;

    /**
     * 根据用户ID和订单状态选择旅行请求
     *
     * @param id 用户ID，用于标识特定的用户
//     * @param status 订单状态，用于过滤用户的订单
     * @return 返回一个Order_Take列表，包含指定用户且符合状态条件的订单
     */
    @Override
    public List<TravelSchedule> selectTravelRequest(Integer id) {
        return travelRequestMapper.selectTravelRequest(id);
    }

    /**
     * 根据行程ID选择行程详情
     *
     * @param itineraryId 行程ID，用于标识特定的行程
     * @return 返回一个TravelRequest对象，包含指定行程的详细信息
     */
    @Override
    public TravelRequest selectItinerary(Integer itineraryId) {
        return travelRequestMapper.selectItinerary(itineraryId);
    }

    @Override
    /**
     * 根据用户ID和状态选择旅行请求
     * 此方法旨在从数据库中检索与给定用户ID和状态相匹配的旅行计划请求
     * 如果状态为5，则将其重置为0，以符合特定的业务逻辑
     * 然后，根据状态值的不同，执行不同的数据检索策略
     *
     * @param id 用户ID，用于查询特定用户的旅行请求
     * @param status 请求的状态，用于过滤旅行请求
     * @return 返回一个TravelSchedule对象列表，表示查询到的旅行请求
     */
    public List<TravelSchedule> selectlookupTravelRequest(Integer id, Integer status) {
        // 如果状态为5，则重置为0，以符合特定查询逻辑
        if (status==5){
            status=0;
        }
        // 初始化一个空的ArrayList，用于存储查询结果
        ArrayList<TravelSchedule> requestArrayList = new ArrayList<>();
        // 如果状态为1，查询所有旅行请求，并更新其状态为1
        if (status==1){
            // 查询旅行请求列表
            List<TravelSchedule> travelRequestList =  travelRequestMapper.selectlookupTravelRequest();

            // 如果查询结果不为空
            if (travelRequestList.size()>0){
                // 遍历旅行请求列表
                for (TravelSchedule travelSchedule : travelRequestList) {
                    // 设置订单状态为1
                    travelSchedule.setOrderstatus(1);
                    // 将更新后的旅行计划对象添加到请求数组列表中
                    requestArrayList.add(travelSchedule);
                }
            }

            // 返回更新后的请求数组列表
            return requestArrayList;
        }else {
            // 否则，根据用户ID查询旅行请求，并根据订单状态进行过滤
            List<TravelSchedule> travelRequestList = travelRequestMapper.selectTravelRequest(id);
            // 检查旅行请求列表是否为空，避免无意义的迭代
            if (travelRequestList.size()>0){
                // 遍历每个旅行日程对象
                for (TravelSchedule travelSchedule : travelRequestList) {
                    // 确保设计师ID不为空，以防止后续查询出错
                    if (travelSchedule.getDesignerId()!=null) {
                        // 调用Mapper方法查询符合条件的订单列表
                        List<Order> orderList = travelRequestMapper.selectTravelOrderStatuslookup(travelSchedule.getUserId(), status,travelSchedule.getId());
                        // 如果存在相关订单，则更新旅行日程的订单状态并添加到请求数组列表中
                        if (orderList.size()>0) {
                            // 设置旅行日程的订单状态为查询到的第一个订单的状态
                            travelSchedule.setOrderstatus(orderList.get(0).getOrderStatus());
                            // 将更新后的旅行日程添加到请求数组列表中
                            requestArrayList.add(travelSchedule);
                        }
                    }
                }
            }
        }
        // 返回查询结果列表
        return requestArrayList;
    }

    @Override
    public Order selectTravelOrderStatus(int userId, Integer addressId) {
        return travelRequestMapper.selectTravelOrderStatus(userId,addressId);
    }

    @Override
    public ResultVo uporderstatus(Integer id,Integer userid) {
        int i;
        Order order = travelRequestMapper.selectOrder(id);
        travelRequestMapper.upOrderStatus(order.getId());
        if (order!=null){
           TravelSchedule travelSchedule = travelRequestMapper.selectTravel(order.getAddressId());
           if (travelSchedule!=null){
               i = travelRequestMapper.UptravelSchedule(order.getAddressId(),userid);
               if (i>0){
                   return ResultVo.ok();
               }else {
                   return ResultVo.error();
               }
           }
        }
        return ResultVo.error();
    }
}
